package srconfig

import (
	"fmt"
	"image"
	"image/draw"
	"image/jpeg"
	_ "image/png" // for Encode
	"os"
	"path/filepath"

	"github.com/nfnt/resize"
	xdraw "golang.org/x/image/draw"
)

// Cocos Creator .meta 简单结构，兼容 3.x 编辑器的常见字段
type cocosMeta struct {
	Ver      string                 `json:"ver"`
	Importer string                 `json:"importer"`
	Imported bool                   `json:"imported"`
	UUID     string                 `json:"uuid"`
	Files    []string               `json:"files"`
	SubMetas map[string]interface{} `json:"subMetas"`
	UserData map[string]interface{} `json:"userData"`
}

// create贴片缩略图：裁剪/缩放并保存，同时创建 .meta 文件
func create贴片缩略图(资源路径, 图片路径 string, 格子宽度 int) (UUID string, err error) {
	// 1. 打开源文件
	srcPath := filepath.Join(资源路径, 图片路径)
	f, err := os.Open(srcPath)
	if err != nil {
		return "", fmt.Errorf("打开图片失败: %w", err)
	}
	defer f.Close()

	// 2. 解码
	srcImg, _, err := image.Decode(f)
	if err != nil {
		return "", fmt.Errorf("解码图片失败: %w", err)
	}

	// 3. 计算左上角格子区域
	bounds := srcImg.Bounds()
	w := 格子宽度
	h := 格子宽度
	if w > bounds.Dx() {
		w = bounds.Dx()
	}
	if h > bounds.Dy() {
		h = bounds.Dy()
	}
	区域 := image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Min.X+w, bounds.Min.Y+h)

	// 4. 裁剪
	subImg := srcImg
	if s, ok := srcImg.(interface {
		SubImage(r image.Rectangle) image.Image
	}); ok {
		subImg = s.SubImage(区域)
	}

	// 5. 缩放
	dst := image.NewRGBA(image.Rect(0, 0, 格子宽度, 格子宽度))
	xdraw.CatmullRom.Scale(dst, dst.Bounds(), subImg, subImg.Bounds(), draw.Over, nil)

	// 6. 生成 UUID 和输出路径
	pngMeta, errMeta := GetMetaFileContent(srcPath + ".meta")
	if errMeta != nil {
		panic("GetMetaFileContent: " + errMeta.Error())
	}

	输出目录 := filepath.Join(资源路径, "editor/thumbs")
	if err := os.MkdirAll(输出目录, os.ModePerm); err != nil {
		return "", fmt.Errorf("创建输出目录失败: %w", err)
	}

	uuid := GetMetaUUID("", pngMeta)
	outPath := filepath.Join(输出目录, uuid+".jpg")

	// 7. 保存图像 (统一保存为 JPEG)
	outF, err := os.Create(outPath)
	if err != nil {
		return "", fmt.Errorf("创建输出图片文件失败: %w", err)
	}
	defer outF.Close()

	if err := jpeg.Encode(outF, dst, &jpeg.Options{Quality: 90}); err != nil {
		return "", fmt.Errorf("保存 jpeg 失败: %w", err)
	}

	return "thumb://" + uuid, nil
}

// create图片缩略图 用于生成图片缩略图
func create图片缩略图(资源路径, 图片路径 string) (最终输出路径 string, err error) {
	// 拼接完整的图片路径
	完整图片路径 := filepath.Join(资源路径, 图片路径)

	// 打开图片文件
	file, err := os.Open(完整图片路径)
	if err != nil {
		return "", fmt.Errorf("无法打开图片文件: %w", err)
	}
	defer file.Close()

	// 解码图片
	img, _, err := image.Decode(file)
	if err != nil {
		return "", fmt.Errorf("无法解码图片: %w", err)
	}

	// 设定最大缩略图尺寸
	maxWidth := uint(64)
	maxHeight := uint(64)

	// 获取原图宽高
	width := uint(img.Bounds().Dx())
	height := uint(img.Bounds().Dy())

	// 根据宽高比例计算缩略图的尺寸，保持原图比例
	var newWidth, newHeight uint
	if width > height {
		// 原图宽度较大，按宽度来缩放
		newWidth = maxWidth
		newHeight = (maxWidth * height) / width
	} else {
		// 原图高度较大，按高度来缩放
		newHeight = maxHeight
		newWidth = (maxHeight * width) / height
	}

	// 生成缩略图
	缩略图 := resize.Resize(newWidth, newHeight, img, resize.Lanczos3)

	// 确保输出目录存在
	缩略图目录 := filepath.Join(资源路径, "editor/thumbs")
	err = os.MkdirAll(缩略图目录, os.ModePerm)
	if err != nil {
		return "", fmt.Errorf("无法创建缩略图目录: %w", err)
	}

	// 6. 生成 UUID 和输出路径
	pngMeta, errMeta := GetMetaFileContent(完整图片路径 + ".meta")
	if errMeta != nil {
		panic("GetMetaFileContent: " + errMeta.Error())
	}
	uuid := GetMetaUUID("", pngMeta)
	// 拼接最终的缩略图文件路径
	缩略图文件路径 := filepath.Join(缩略图目录, uuid+".jpg")

	// 创建输出文件
	缩略图文件, err := os.Create(缩略图文件路径)
	if err != nil {
		return "", fmt.Errorf("无法创建缩略图文件: %w", err)
	}
	defer 缩略图文件.Close()

	// 保存为 JPEG 格式
	err = jpeg.Encode(缩略图文件, 缩略图, nil)
	if err != nil {
		return "", fmt.Errorf("保存缩略图时出错: %w", err)
	}

	return "thumb://" + uuid, nil
}

func main() {

}
